{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "1e2bb476",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras.layers import Dropout, Dense, SimpleRNN\n",
    "import matplotlib.pyplot as plt\n",
    "import os\n",
    "import pandas as pd\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from sklearn.metrics import mean_squared_error, mean_absolute_error\n",
    "import math"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "c8957e76",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "numpy 1.21.4\n",
      "pandas 1.3.4\n",
      "tensorflow 2.7.0\n"
     ]
    }
   ],
   "source": [
    "for module in np, pd, tf:\n",
    "     print (module.__name__, module.__version__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "247a90dd",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 这两行代码解决 plt 中文显示的问题\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "f298f448",
   "metadata": {},
   "outputs": [],
   "source": [
    "stock = pd.read_csv('../dataset/sh600031.csv')  # 读取股票文件\n",
    "# stock = stock.drop(['成交额'],axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "15bdcbdf",
   "metadata": {},
   "source": [
    "### 用多特征预测股价\n",
    "### 将数据集分成训练集：测试集 == 4:1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "c46c880d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 取除日期外全部特征\n",
    "training_set = stock.iloc[0:int(len(stock) / 5 * 4), 1:]\n",
    "test_set = stock.iloc[int(len(stock) / 5 * 4):, 1:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "fcbfd899",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((3539, 5), (885, 5))"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "training_set.shape , test_set.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e9a26d82",
   "metadata": {},
   "source": [
    "# 移动平均处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "e2e18041",
   "metadata": {},
   "outputs": [],
   "source": [
    "def mean_handle(total_list, cycle):\n",
    "    def handle(_list):\n",
    "        datalist = list()\n",
    "        for i in range(len(_list)):\n",
    "            # 最新数据在列表的后面\n",
    "            # 1. 收盘价/均值\n",
    "            datalist.append(_list[i] / np.mean(_list))\n",
    "        return datalist\n",
    "\n",
    "    # 根据周期分组\n",
    "    new_list = list()\n",
    "    for _ in range(0, int(len(total_list) / cycle)):\n",
    "        new_list.append(total_list[_ * cycle:(_ + 1) * cycle])\n",
    "    if len(new_list) * cycle != len(total_list):\n",
    "        new_list.append(total_list[len(new_list) * cycle - len(total_list):])\n",
    "\n",
    "    data = list()\n",
    "    for value in [handle(list(map(float, data_list))) for data_list in new_list]:\n",
    "        data.extend(value)\n",
    "\n",
    "    return data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "9719fce9",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "for column in training_set.columns:\n",
    "    training_set[column] = mean_handle(training_set[column].tolist(),30)\n",
    "for column in test_set.columns:\n",
    "    test_set[column] = mean_handle(test_set[column].tolist(),30)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "e704f6fe",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.953394</td>\n",
       "      <td>0.936228</td>\n",
       "      <td>0.847863</td>\n",
       "      <td>0.881246</td>\n",
       "      <td>9.842423</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.882926</td>\n",
       "      <td>0.902849</td>\n",
       "      <td>0.887936</td>\n",
       "      <td>0.903587</td>\n",
       "      <td>2.240386</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.907797</td>\n",
       "      <td>0.893894</td>\n",
       "      <td>0.907340</td>\n",
       "      <td>0.901932</td>\n",
       "      <td>1.150006</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.903652</td>\n",
       "      <td>0.904478</td>\n",
       "      <td>0.915354</td>\n",
       "      <td>0.906483</td>\n",
       "      <td>0.616261</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.901579</td>\n",
       "      <td>0.921981</td>\n",
       "      <td>0.915354</td>\n",
       "      <td>0.929652</td>\n",
       "      <td>1.001349</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       open      high       low     close    volume\n",
       "0  0.953394  0.936228  0.847863  0.881246  9.842423\n",
       "1  0.882926  0.902849  0.887936  0.903587  2.240386\n",
       "2  0.907797  0.893894  0.907340  0.901932  1.150006\n",
       "3  0.903652  0.904478  0.915354  0.906483  0.616261\n",
       "4  0.901579  0.921981  0.915354  0.929652  1.001349"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "training_set.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "bbd8ee96",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>3539</th>\n",
       "      <td>0.961987</td>\n",
       "      <td>0.963128</td>\n",
       "      <td>0.971636</td>\n",
       "      <td>0.973730</td>\n",
       "      <td>0.857022</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3540</th>\n",
       "      <td>0.974813</td>\n",
       "      <td>0.994271</td>\n",
       "      <td>0.989388</td>\n",
       "      <td>1.002919</td>\n",
       "      <td>1.494424</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3541</th>\n",
       "      <td>0.994636</td>\n",
       "      <td>1.002345</td>\n",
       "      <td>1.009507</td>\n",
       "      <td>1.009924</td>\n",
       "      <td>1.303986</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3542</th>\n",
       "      <td>1.008629</td>\n",
       "      <td>1.005806</td>\n",
       "      <td>1.005957</td>\n",
       "      <td>0.993579</td>\n",
       "      <td>0.703333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3543</th>\n",
       "      <td>0.991138</td>\n",
       "      <td>0.980430</td>\n",
       "      <td>0.968086</td>\n",
       "      <td>0.972563</td>\n",
       "      <td>1.303135</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          open      high       low     close    volume\n",
       "3539  0.961987  0.963128  0.971636  0.973730  0.857022\n",
       "3540  0.974813  0.994271  0.989388  1.002919  1.494424\n",
       "3541  0.994636  1.002345  1.009507  1.009924  1.303986\n",
       "3542  1.008629  1.005806  1.005957  0.993579  0.703333\n",
       "3543  0.991138  0.980430  0.968086  0.972563  1.303135"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_set.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "172bbdf1",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "training_set = training_set.values\n",
    "test_set = test_set.values"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f3c6b862",
   "metadata": {},
   "source": [
    "# 归一化处理（进行缩放）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "d2ee46e5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 归一化\n",
    "sc = MinMaxScaler(feature_range=(0, 1))  # 定义归一化：归一化到(0，1)之间\n",
    "# 缩放\n",
    "training_set_scaled = sc.fit_transform(training_set)  # 求得训练集的最大值，最小值这些训练集固有的属性，并在训练集上进行归一化\n",
    "test_set = sc.transform(test_set)  # 利用训练集的属性对测试集进行归一化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "9310a93f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 参数设置\n",
    "# 步进值\n",
    "seq_len = 5"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d6b53e2d",
   "metadata": {},
   "source": [
    "# 训练集处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "c4720fa9",
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train = []\n",
    "y_train = []\n",
    "\n",
    "# 数据进行分组\n",
    "for i in range(seq_len, len(training_set_scaled)):\n",
    "    # 全部特征\n",
    "    x_train.append(training_set_scaled[i - seq_len:i, 0:])\n",
    "    # 收盘价\n",
    "    y_train.append(training_set_scaled[i, list(stock.iloc[0:int(len(stock) / 5 * 4), 1:].columns).index('close')])\n",
    "\n",
    "# 将训练集由list格式变为array格式\n",
    "x_train, y_train = np.array(x_train), np.array(y_train)\n",
    "x_train = np.reshape(x_train, (x_train.shape[0], seq_len, training_set.shape[1]))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1f4d9e55",
   "metadata": {},
   "source": [
    "# 测试集处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "807b27a8",
   "metadata": {},
   "outputs": [],
   "source": [
    "x_test = []\n",
    "y_test = []\n",
    "\n",
    "# 利用for循环，遍历整个测试集，提取测试集中连续5天的开盘价作为输入特征x_train，第6天的数据作为标签\n",
    "for i in range(seq_len, len(test_set)):\n",
    "    # 全部特征\n",
    "    x_test.append(test_set[i - seq_len:i, 0:])\n",
    "    # 收盘价\n",
    "    y_test.append(test_set[i, list(stock.iloc[0:int(len(stock) / 5 * 4), 1:].columns).index('close')])\n",
    "\n",
    "    # 测试集变array并reshape为符合RNN输入要求：[送入样本数， 循环核时间展开步数， 每个时间步输入特征个数]\n",
    "x_test, y_test = np.array(x_test), np.array(y_test)\n",
    "x_test = np.reshape(x_test, (x_test.shape[0], seq_len, test_set.shape[1]))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6e45bc36",
   "metadata": {},
   "source": [
    "# 构建模型\n",
    "\n",
    "### 序列化建模，一般步骤为：\n",
    "\n",
    "　　* 1、实例化一个Sequential类，该类是继承于Model类；\n",
    "\n",
    "　　* 2、添加所需要的神经网络层；\n",
    "\n",
    "　　* 3、用compile进行编译模型；\n",
    "\n",
    "　　* 4、用fit训练模型；\n",
    "\n",
    "　　* 5、用predict预测。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "6f2d3b77",
   "metadata": {},
   "outputs": [],
   "source": [
    "model = tf.keras.Sequential([\n",
    "    SimpleRNN(80, return_sequences=True),\n",
    "    Dropout(0.2),\n",
    "    SimpleRNN(100),\n",
    "    Dropout(0.2),\n",
    "    Dense(1)\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "d6fb9d91",
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(optimizer=tf.keras.optimizers.Adam(0.001),loss='mean_squared_error')  \n",
    "# 损失函数用均方误差\n",
    "# 该应用只观测loss数值，不观测准确率，所以删去metrics选项，一会在每个epoch迭代显示时只显示loss值"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c4c9c0db",
   "metadata": {},
   "source": [
    "# 预测一次，并保存预测结构，用于之后的验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "1f8a0afa",
   "metadata": {},
   "outputs": [],
   "source": [
    "checkpoint_save_path = \"./checkpoint/rnn_stock.ckpt\"\n",
    "if os.path.exists(checkpoint_save_path + '.index'):\n",
    "    print('-------------load the model-----------------')\n",
    "    model.load_weights(checkpoint_save_path)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e071782a",
   "metadata": {},
   "source": [
    "# 参数详解：\n",
    "* x=None, #输入的x值\n",
    "* y=None, #输入的y标签值\n",
    "* batch_size=None, #整数 ，每次梯度更新的样本数即批量大小。未指定，默认为32。\n",
    "* epochs=1, #迭代次数\n",
    "* verbose=1, #整数，代表以什么形式来展示日志状态，\n",
    "* verbose = 0 为不在标准输出流输出日志信息，verbose = 1 为输出进度条记录，verbose = 2 为每个epoch输出一行记录\n",
    "* callbacks=None, #回调函数，这个list中的回调函数将会在训练过程中的适当时机被调用，参考回调函数\n",
    "* validation_split=0.0, #浮点数0-1之间，用作验证集的训练数据的比例。模型将分出一部分不会被训练的验证数据，并将在每一轮结束时评估这些验证数据的误差和任何其他模型指标。\n",
    "* validation_data=None, #这个参数会覆盖 validation_split\n",
    "   即两个函数只能存在一个，它的输入为元组 (x_val，y_val)，这作为验证数据。\n",
    "* shuffle=True, #布尔值。是否在每轮迭代之前混洗数据\n",
    "* class_weight=None,\n",
    "* sample_weight=None, \n",
    "* initial_epoch=0, \n",
    "* steps_per_epoch=None, #一个epoch包含的步数（每一步是一个batch的数据送入）\n",
    "   当使用如TensorFlow数据Tensor之类的输入张量进行训练时，默认的None代表自动分割，即数据集样本数/batch样本数。\n",
    "* validation_steps=None, #在验证集上的step总数，仅当steps_per_epoch被指定时有用。\n",
    "* validation_freq=1, #指使用验证集实施验证的频率。当等于1时代表每个epoch结束都验证一次\n",
    "* max_queue_size=10,\n",
    "* workers=1,\n",
    "* use_multiprocessing=False   "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "9cc9532d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 训练参数\n",
    "batch_size = 64\n",
    "epochs = 100\n",
    "validation_freq=1\n",
    "# 等等"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "5da0f3b6",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/100\n",
      "56/56 [==============================] - 4s 21ms/step - loss: 0.0733 - val_loss: 0.0013\n",
      "Epoch 2/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0136 - val_loss: 6.9969e-04\n",
      "Epoch 3/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0094 - val_loss: 8.6301e-04\n",
      "Epoch 4/100\n",
      "56/56 [==============================] - 1s 13ms/step - loss: 0.0074 - val_loss: 6.8700e-04\n",
      "Epoch 5/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0064 - val_loss: 5.5594e-04\n",
      "Epoch 6/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0053 - val_loss: 6.8913e-04\n",
      "Epoch 7/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0048 - val_loss: 7.2817e-04\n",
      "Epoch 8/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0044 - val_loss: 5.2139e-04\n",
      "Epoch 9/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0040 - val_loss: 0.0012\n",
      "Epoch 10/100\n",
      "56/56 [==============================] - 1s 10ms/step - loss: 0.0037 - val_loss: 5.5606e-04\n",
      "Epoch 11/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0036 - val_loss: 5.6207e-04\n",
      "Epoch 12/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0034 - val_loss: 9.4385e-04\n",
      "Epoch 13/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0035 - val_loss: 5.0891e-04\n",
      "Epoch 14/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0033 - val_loss: 6.7928e-04\n",
      "Epoch 15/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0030 - val_loss: 5.0618e-04\n",
      "Epoch 16/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0029 - val_loss: 5.0790e-04\n",
      "Epoch 17/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0027 - val_loss: 5.0151e-04\n",
      "Epoch 18/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0028 - val_loss: 5.8248e-04\n",
      "Epoch 19/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0028 - val_loss: 6.0910e-04\n",
      "Epoch 20/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0027 - val_loss: 5.0437e-04\n",
      "Epoch 21/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0026 - val_loss: 5.3444e-04\n",
      "Epoch 22/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0026 - val_loss: 5.3963e-04\n",
      "Epoch 23/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0025 - val_loss: 5.5580e-04\n",
      "Epoch 24/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0024 - val_loss: 4.9979e-04\n",
      "Epoch 25/100\n",
      "56/56 [==============================] - 1s 10ms/step - loss: 0.0023 - val_loss: 6.3935e-04\n",
      "Epoch 26/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0023 - val_loss: 5.7567e-04\n",
      "Epoch 27/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0023 - val_loss: 4.9204e-04\n",
      "Epoch 28/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0021 - val_loss: 5.2255e-04\n",
      "Epoch 29/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0021 - val_loss: 5.4571e-04\n",
      "Epoch 30/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0021 - val_loss: 5.8758e-04\n",
      "Epoch 31/100\n",
      "56/56 [==============================] - 1s 10ms/step - loss: 0.0021 - val_loss: 6.6558e-04\n",
      "Epoch 32/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0021 - val_loss: 5.8435e-04\n",
      "Epoch 33/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0021 - val_loss: 6.2455e-04\n",
      "Epoch 34/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0020 - val_loss: 4.9495e-04\n",
      "Epoch 35/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0020 - val_loss: 5.6460e-04\n",
      "Epoch 36/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0020 - val_loss: 5.5535e-04\n",
      "Epoch 37/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0019 - val_loss: 4.9539e-04\n",
      "Epoch 38/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0019 - val_loss: 4.9077e-04\n",
      "Epoch 39/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0019 - val_loss: 4.9796e-04\n",
      "Epoch 40/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0019 - val_loss: 4.8810e-04\n",
      "Epoch 41/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0018 - val_loss: 5.0002e-04\n",
      "Epoch 42/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0018 - val_loss: 5.3079e-04\n",
      "Epoch 43/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0018 - val_loss: 4.9244e-04\n",
      "Epoch 44/100\n",
      "56/56 [==============================] - 1s 13ms/step - loss: 0.0018 - val_loss: 4.8794e-04\n",
      "Epoch 45/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0018 - val_loss: 5.6026e-04\n",
      "Epoch 46/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0018 - val_loss: 5.3591e-04\n",
      "Epoch 47/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0017 - val_loss: 5.2522e-04\n",
      "Epoch 48/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0017 - val_loss: 5.9292e-04\n",
      "Epoch 49/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0018 - val_loss: 4.9368e-04\n",
      "Epoch 50/100\n",
      "56/56 [==============================] - 1s 10ms/step - loss: 0.0018 - val_loss: 7.4985e-04\n",
      "Epoch 51/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0019 - val_loss: 5.1904e-04\n",
      "Epoch 52/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0017 - val_loss: 5.2341e-04\n",
      "Epoch 53/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0016 - val_loss: 5.2902e-04\n",
      "Epoch 54/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0017 - val_loss: 4.8763e-04\n",
      "Epoch 55/100\n",
      "56/56 [==============================] - ETA: 0s - loss: 0.001 - 1s 11ms/step - loss: 0.0016 - val_loss: 5.4416e-04\n",
      "Epoch 56/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0016 - val_loss: 5.0862e-04\n",
      "Epoch 57/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0017 - val_loss: 5.0563e-04\n",
      "Epoch 58/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0016 - val_loss: 5.2108e-04\n",
      "Epoch 59/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0016 - val_loss: 4.8641e-04\n",
      "Epoch 60/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0015 - val_loss: 4.9892e-04\n",
      "Epoch 61/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0015 - val_loss: 4.8735e-04\n",
      "Epoch 62/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0016 - val_loss: 4.9228e-04\n",
      "Epoch 63/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0015 - val_loss: 6.5187e-04\n",
      "Epoch 64/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0016 - val_loss: 4.8183e-04\n",
      "Epoch 65/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0015 - val_loss: 5.5086e-04\n",
      "Epoch 66/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0016 - val_loss: 4.8396e-04\n",
      "Epoch 67/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0016 - val_loss: 5.2795e-04\n",
      "Epoch 68/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0015 - val_loss: 6.5865e-04\n",
      "Epoch 69/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0015 - val_loss: 4.8161e-04\n",
      "Epoch 70/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0015 - val_loss: 5.5105e-04\n",
      "Epoch 71/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0015 - val_loss: 4.8161e-04\n",
      "Epoch 72/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0014 - val_loss: 4.7948e-04\n",
      "Epoch 73/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0016 - val_loss: 5.5107e-04\n",
      "Epoch 74/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0015 - val_loss: 6.3624e-04\n",
      "Epoch 75/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0015 - val_loss: 5.1795e-04\n",
      "Epoch 76/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0015 - val_loss: 4.8486e-04\n",
      "Epoch 77/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0014 - val_loss: 4.9749e-04\n",
      "Epoch 78/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0014 - val_loss: 5.3901e-04\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 79/100\n",
      "56/56 [==============================] - 1s 10ms/step - loss: 0.0015 - val_loss: 4.8132e-04\n",
      "Epoch 80/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0014 - val_loss: 5.2961e-04\n",
      "Epoch 81/100\n",
      "56/56 [==============================] - 1s 10ms/step - loss: 0.0014 - val_loss: 4.8061e-04\n",
      "Epoch 82/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0015 - val_loss: 5.0974e-04\n",
      "Epoch 83/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0014 - val_loss: 7.3699e-04\n",
      "Epoch 84/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0017 - val_loss: 5.2075e-04\n",
      "Epoch 85/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0014 - val_loss: 6.8445e-04\n",
      "Epoch 86/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0014 - val_loss: 5.6280e-04\n",
      "Epoch 87/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0014 - val_loss: 5.3624e-04\n",
      "Epoch 88/100\n",
      "56/56 [==============================] - 1s 10ms/step - loss: 0.0014 - val_loss: 5.1123e-04\n",
      "Epoch 89/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0014 - val_loss: 4.8481e-04\n",
      "Epoch 90/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0014 - val_loss: 5.0152e-04\n",
      "Epoch 91/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0014 - val_loss: 4.9982e-04\n",
      "Epoch 92/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0014 - val_loss: 4.8654e-04\n",
      "Epoch 93/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0014 - val_loss: 5.4230e-04\n",
      "Epoch 94/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0014 - val_loss: 4.8576e-04\n",
      "Epoch 95/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0014 - val_loss: 5.0620e-04\n",
      "Epoch 96/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0013 - val_loss: 5.0089e-04\n",
      "Epoch 97/100\n",
      "56/56 [==============================] - ETA: 0s - loss: 0.001 - 1s 10ms/step - loss: 0.0014 - val_loss: 8.2103e-04\n",
      "Epoch 98/100\n",
      "56/56 [==============================] - 1s 12ms/step - loss: 0.0016 - val_loss: 5.4461e-04\n",
      "Epoch 99/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0014 - val_loss: 4.8659e-04\n",
      "Epoch 100/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.0014 - val_loss: 4.9532e-04\n",
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      " Layer (type)                Output Shape              Param #   \n",
      "=================================================================\n",
      " simple_rnn (SimpleRNN)      (None, 5, 80)             6880      \n",
      "                                                                 \n",
      " dropout (Dropout)           (None, 5, 80)             0         \n",
      "                                                                 \n",
      " simple_rnn_1 (SimpleRNN)    (None, 100)               18100     \n",
      "                                                                 \n",
      " dropout_1 (Dropout)         (None, 100)               0         \n",
      "                                                                 \n",
      " dense (Dense)               (None, 1)                 101       \n",
      "                                                                 \n",
      "=================================================================\n",
      "Total params: 25,081\n",
      "Trainable params: 25,081\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,\n",
    "                                                 save_weights_only=True,\n",
    "                                                 save_best_only=True,\n",
    "                                                 monitor='val_loss')\n",
    "\n",
    "_model = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_test, y_test), validation_freq=validation_freq,\n",
    "                   callbacks=[cp_callback])\n",
    "\n",
    "model.summary()\n",
    "\n",
    "file = open('./weights.txt', 'w')  # 参数提取\n",
    "for v in model.trainable_variables:\n",
    "    file.write(str(v.name) + '\\n')\n",
    "    file.write(str(v.shape) + '\\n')\n",
    "    file.write(str(v.numpy()) + '\\n')\n",
    "file.close()\n",
    "\n",
    "loss = _model.history['loss']\n",
    "val_loss = _model.history['val_loss']\n",
    "\n",
    "plt.plot(loss, label='训练损失')\n",
    "plt.plot(val_loss, label='测试损失')\n",
    "plt.title('训练和测试损失')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "cf550192",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 预测\n",
    "# 测试集输入模型进行预测\n",
    "predicted_stock_price = model.predict(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "368f9504",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 归一时是对所有数据列进行的归一\n",
    "# 补充数据列之后才能进行反归一\n",
    "predicted_df = pd.DataFrame(test_set[seq_len:])\n",
    "predicted_df.iloc[:, list(stock.iloc[0:int(len(stock) / 5 * 4), 1:].columns).index('close')] = predicted_stock_price\n",
    "predicted_df.head()\n",
    "predicted_set = predicted_df.values\n",
    "# 对预测数据还原---从（0，1）反归一化到原始范围\n",
    "predicted_stock_price = sc.inverse_transform(predicted_set)\n",
    "# 对真实数据还原---从（0，1）反归一化到原始范围\n",
    "real_stock_price = sc.inverse_transform(test_set[seq_len:])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "2dc1b548",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 只取收盘价\n",
    "real_stock_price = real_stock_price[:,list(stock.iloc[0:int(len(stock) / 5 * 4), 1:].columns).index('close')]\n",
    "predicted_stock_price = predicted_stock_price[:,list(stock.iloc[0:int(len(stock) / 5 * 4), 1:].columns).index('close')]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "b968b0a9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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X14qpZzo3z7sSWH69OnMmTOn8o4GBgYGBg6EEJ8GbTfqIwMDAwMDB4YUDAwMDAwcGFIwMDAwMHAw7G0KQcjlcsyfP590Oj3YTVnlkEqlmDZtGvG4yaxgYDAcMSJJYf78+bS0tDB9+nRUOhuDgYCUkmXLljF//nxmzJgx2M0xMDDoBUak+iidTjN+/HhDCAMMIQTjx483EpqBwTDGiCQFwBDCIME8d4O64/XXoVAY7FaMWIxYUhjqkFJSLu9UoVDw/J7Pu/XXTb4qg1UW//sfbLEF/PjHg92SEQtDCnXCEUccwc4778x6663Hww8/zHnnncfWW2/NhhtuyB/+8AdeeOEFdtttN2bPns306dPZeuutmTFjBltssQWzZ89mt91247XXXnPOd9ppp/Hkk08CcPfdd3P66acHXnfPPfd0Pp9wwgnMmzevnrdpYDCwWLRI/X/hhcFtxwjGiDQ0DwXEYjFuu+027r77bpLJJMuWLeOGG27gpZdeIhqNsuOOO3L88cfz4Ycfks/nWWeddfj444+ZNm0aa665JltssQVbbrklAN3d3bzyyitcd9115HI5fve73zF58mSeeOIJdt99d0BJD8VikYaGBvL5PPPnz+fpp5/mZz/7GcuXL2eLLbbgggsuGMxHYmDQd0SsdWwxrFCdQV8x8knhrLNAW3H3C7bYAn7967K7SCn5+te/zsKFC0kkEjz33HP89re/pbW1lTPOOIP29nYefvhhrr/+evL5PHvvvTdPPPEE2267LWussQa//e1vOeaYYwD47W9/y0YbbUQkEuH000/n29/+NgcddBCHHnoora2tHHXUUfz3v//lzDPP5K233uLwww8nFoux7rrrcvnll/Od73yHQw89tH+fgYHBYMAmBWNTqBtGPikMEorFIjfeeCN3330306ZN49JLL6W1tZVNNtmEJ554gtVXX53PP/+cr3/96wCOqsjO42Srgd5//31uv/12ttxyS0444QSmT5/O7NmzSSaTnH/++Vx77bXk83mOO+44zjnnHL773e9y+umnM3HiRJqampg9ezYHHHAAG2200aA8BwODfoWRFOqOkU8KFVb09YLfSPyNb3yDrbbailwux/Lly3nnnXfYfffdmTx5MtFo1HNsoVBgm222AaCtrY3LL7+cO++8k8svv5zHHnuMBx54gK9+9aucd955PP/888617r33XmbOnMnf//53NtxwQ55//nm+973v8dxzz3H88cdz6qmnst122w3cQzAw6G/YEoIhhbph5JPCIKGzs5Mvf/nLLFy4kBtvvJFvfetbHHvsscyfP5/XXnuNa6+9lgcffNBx4SxYnd0miEcffZQ5c+Zw9tlns3TpUu68805WW201uru7WWONNQBobGwElBvoo48+ysYbb0x7ezsXX3wxl112GZ999hk33HADAOussw4zZ84c6MdgYNC/yGbVf6M+qhsMKdQJS5Ys4aWXXuKqq64ClPfQt771Lbq7u7nrrrsYP348p556KjfffDOHHXYYd911FwBHHnkkTz/9NAcddFDgeefOncuOO+5Ysn3s2LGcddZZvPDCC4wbN45tttmGyZMnc8455/DJJ59w3nnnMXFiSep0A4OhBymVJOCToAGXFIykUDcYl9Q6YOnSpTQ2NhKNRikUCgghGDNmDIsWLaKrq4t0Os38+fM58MAD+fDDD8lms3z22WdEIhEymQz//Oc/2WWXXVhkud8VrQGwePFinn766UD7wNZbb01TU5PzXQjB7373O2bPnu0YrA0MhgWuuQZiMVi6tPQ3Qwp1h5EU6oB7772Xo48+mnvuuYebbrqJpqYmzj33XC655BJisRh77bUX3/jGN7jiiitYf/31effdd1m0aBHf+ta3mDRpEtdffz3vv/8+U6ZMASCTyZDP5zn33HP5+c9/TsQytrW3t5dc204xkcvl+Na3vuVICuecc87APQADg77gllvU/3nzYMIE72+GFOoOMdyjY2fNmiX9ldfeeecdNtxww0FqkUI+nyeXyxGLxWhtbaWhoYGxY8c6v3V3dzNq1Kh+v+7KlSsZPXp0iY1iIDEUnr/BMMY228CcOfDSSzBrlve3W2+FE06ATTaBN98cnPaNEAghXpZSzvJvN5JCnRCLxYjF1OOdOnVqyW/1IASA0aNHA4NDBgYG/QK77wZJA0ZSqDuMTcHAwGBooVyAmk0KZtFTNxhSMDAwGFowpDCoqCspCCEmCyGeqbDPhkKI+7XvOwkhPhRCPCmEeKye7TMwMBiCKKc+yuXU/4hZz9YLdXuyQoixwC1AU5l91gZ+CYzWNm8HnC6lnC2l3DP4yOGFXC7nuJWCMjQXi0U6OjpCj/n4449pa2ur+homFbfBiIGRFAYV9aTbAnA0UOo36aID+KJv2/bAT4QQLwohzg06SAhxshBijhBiTmtra/+0th/xzDPPsPfee3PQQQex+uqrc+ONN3LIIYcwfvx4Dj30UA499FCef/559tprL5588kmOPPJITjzxRI4++mheffVVAG666Sbnc6U03IBJxW0wclBOUrAXM6aYU91QN+8jKWU7lK/EJaVcErDPH4FHrM8vCiFuklIu8x13A3ADKJfU/mt1/2CXXXbh+9//Pg8//DBf+9rXOOywwzjllFPYd999ue+++5z9HnzwQdra2ohGo/zsZz/j9ttvZ+nSpeyzzz7suOOOTjxCpTTcgEnFbTByYJNCkKRgch/VHUPRJfVxKWUeQAjxKTAdWFb2iDIYpMzZNDY28p///Idf/epXvPjii5xxxhlsscUWnHLKKTz//PPccMMNLFmyhIMPPhiAU045hU033ZR4PE4ikfCcq5o03GeeeSb33HOPScVtMPxRLhOqLSlo6k+D/sWQIgWhRIZnhRC7o2wRWwEfDm6rasftt9/ODTfcgJSS2bNns99++/GFL3yB5uZmdthhB+bPn8/GG2/MD3/4QzbYYANAxRWExS5Uk4YbYNNNNzWpuA2GP8qpj2xJwSTEqxsGjBSEEHsAG0kpfxu2j5RSCiGuAF4FOoFzpZQr+3Ldwcicfeyxx3Lcccdx0EEHsdFGGzF16lQ+/vhjFi1axAQrbL+lpYUHHniAWCyGlNKJfg4y+laThhswqbgNRgbKGZrzeU7gZhrnJ/ndwLZqlUHdSUFKOdv6/zjweLl9rM9/Af5S73bVExHNXe6yyy7jlVde4eOPP2bevHmsueaazqR7//338/777xOLxWhvb6elpcUhCB2V0nADJhW3wYiBFBHO4tecPLeRjf0/FgrcygnQhiGFOmFIqY9GIqLRKI2Njay11lo8/fTTJJNJdthhB4rFIldffTV33303r732Gvfeey9z587lpJNOolgs8uyzzzrnqJSGG+DUU081qbgNRgTmZSdzNWdy70+6mXeG70ejNqo7TARInaDHDWy88cZ0dHSw55578pWvfIU999yTP/zhD+y44460tLTw4x//mIsuuohUKsX111/vZE6NRqNVpeEGTCpugxEDx/moGOC5qBmY7ZAFg/6FkRTqgGw2y4477sixxx5LPp/ntNNOQ0rJddddR09PD0cddRQXXXQRRx11FEuWLOHCCy9k2rRpXHDBBSxc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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画出真实数据和预测数据的对比曲线\n",
    "plt.plot(real_stock_price, color='red', label='股票价格')\n",
    "plt.plot(predicted_stock_price, color='blue', label='预测股票价格')\n",
    "plt.title('股票价格预测')\n",
    "plt.xlabel('时间')\n",
    "plt.ylabel('股票价格')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "3b2fbfd3",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "均方误差: 0.000921\n",
      "均方根误差: 0.030351\n",
      "平均绝对误差: 0.020203\n"
     ]
    }
   ],
   "source": [
    "# 评估\n",
    "# calculate MSE 均方误差 ---> E[(预测值-真实值)^2] (预测值减真实值求平方后求均值)\n",
    "mse = mean_squared_error(predicted_stock_price, real_stock_price)\n",
    "# calculate RMSE 均方根误差--->sqrt[MSE]    (对均方误差开方)\n",
    "rmse = math.sqrt(mean_squared_error(predicted_stock_price, real_stock_price))\n",
    "# calculate MAE 平均绝对误差----->E[|预测值-真实值|](预测值减真实值求绝对值后求均值）\n",
    "mae = mean_absolute_error(predicted_stock_price, real_stock_price)\n",
    "print('均方误差: %.6f' % mse)\n",
    "print('均方根误差: %.6f' % rmse)\n",
    "print('平均绝对误差: %.6f' % mae)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "fb5827cd",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "准确率：0.9884300817471174\n"
     ]
    }
   ],
   "source": [
    "#ACC\n",
    "error = 0\n",
    "summery = 0\n",
    "for i in range(24):\n",
    "    error += abs(predicted_stock_price[i] - real_stock_price[i])\n",
    "    summery += real_stock_price[i]\n",
    "acc = 1 - error/summery\n",
    "print(\"准确率：{}\".format(acc))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "deep",
   "language": "python",
   "name": "deep"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
